<?php
/*
 * 文件名：UploadFile.class.php
 * 功  能：文件上传类
 * 日  期：2009-5-1
 * UICAN整理于2009-07-16
 */

class UploadFile{
	
	/**
	 * 允许上传文件的大小
	 * 设置为 -1 代表没有限制
	 */
	public $max_size = 100000;
	
	/**
	 * 允许上传文件的类型
	 */
	public $allow_types = 'jpg|gif|png|zip|rar|txt|html|bmp|pdf';

	/**
	 * 上传文件存放的目录
	 */
	public $sava_path = 'uploads/';
	
	/**
	 * 上传文件后的路径及文件名
	 */
	public $uploaded_file_path = '';
	
	
	/**
	 * 文件名命名方式date time 都代表以当前时间命名  其他都代表使用原文件名
	 */
	public $file_name = 'date';

	/**
	 * 错误信息
	 */
	public  $errmsg = '';



	/**
	 * 开始上传文件
	 * $access public
	 * @param object - $file 文件域对象
	 * @return array - $file_info 文件信息
	 */
	public function upLoad($file){
		$name = $file['name']; //文件名
		$type = $file['type']; //获取文件类型
		$size = $file['size']; //获取上传文件大小
		$tmp_name = $file['tmp_name']; //临时文件地址文件名
		$error = $file['error']; //获得文件上传信息
		if($error == 0 ){ // Go If
			//如果错误代码为0代表没有错误
			if(is_uploaded_file($tmp_name)){ // Go IF
				//检测文件是否通过 http post 上传
				$allow_types = explode('|',$this->allow_types); //分割允许上传的文件类型
				$type = $this->getExtention($name); //获取上传文件的类型
				if(in_array($type,$allow_types)){
					//如果上传的文件类型在用户允许的类型中
					if($size < $this->max_size){
						 //如果上传文件大小不超过允许上传的大小
						 $this->setSavaPath(); //设置上传文件保存路径
						 if($this->file_name == 'date' || $this->file_name == 'time'){
							  //如果设置了文件名命名方式为时间或日期
						 	  $new_name = $this->sava_path . date('YmdHis',time()) . '.' . $type;
						 }else{
							  $new_name = $this->sava_path . $name;
						 }
						 if($this->move_file($tmp_name, $new_name)){
							$this->setErrMsg('文件上传成功！');
							$file_info = array(
								'size'=>$size,
								'type'=>$type,
								'name'=>$new_name,
								'error'=>$error
							);
							$this->uploaded_file_path = $new_name;
							return $file_info;
						 }else{
							$this->setErrMsg('文件移动失败！');
						 }

					}else{
						$this->setErrMsg('文件过大，最多可上传' . $this->max_size . 'k的文件！');
					}
				}else{
					//如果没在提示错误
					$this->setErrMsg('只支持上传' . $this->allow_types . '等文件类型！');
				}
			}else{ //Else
				//如果不是设置错误信息
				$this->setErrMsg('文件不是通过HTTP POST方式上传的！');
			} // End If is_uploaded_file
		} // End If	 error = 0
	}

	/**
	 * 移动文件
	 * @access public
	 * @param string - $tmp_name 原文件路径加文件名
	 * @param string - $new_name 新文件路径加文件名
	 * @return 返回文件是否移动成功
	 */
	 protected function move_file($tmp_name, $new_name){
		if(!file_exists($tmp_name)){
			$this->setErrMsg('需要移动的文件不存在');
		}
		if(file_exists($new_name)){
			$this->setErrMsg('文件' . $new_name . '已经存在！');
		}
		if(function_exists('move_uploaded_file')){
			$state =  move_uploaded_file($tmp_name, $new_name);
		}else if(function_exists('rename')){
			$state = rename($tmp_name, $new_name);
		}  
		return $state;
	}

	/**
	 * 设置文件上传后的保存路径
	 */
	protected function setSavaPath(){
		$this->sava_path = (preg_match('/\/$/',$this->sava_path)) ? $this->sava_path : $this->sava_path . '/';
		if(!is_dir($this->sava_path)){
			//如果目录不存在，创建目录
			$this->makeDir();
		}
	}
	

	/**
	 * 创建目录
	 * @access public
	 * @param  string - $dir 目录名
	 */
	protected function makeDir($dir = null){
		if(!$dir){
			$dir = $this->sava_path;
		}
		if(is_dir($dir)){
			$this->setErrMsg('需要创建的文件夹已经存在！');
		}
		$dir = explode('/', $dir);
		foreach($dir as $v){
			if($v){
				$d .= $v . '/';
				if(!is_dir($d)){
					$state = mkdir($d, 0777);
					if(!$stete)
						$this->setErrMsg('在创建目录' . $d . '时出错！');
				}
			}
		}
		return true;
	}

	/**
	 * 设置错误信息
	 * $access protected
	 * $param string - $msg 错误信息字符串
	 */
	protected function setErrMsg($msg){
		$this->errmsg = $msg;
	}

/**
 * 获取文件扩展名
 * @access public
 * @param  string - $name 上传的文件名
 */
  protected function getExtention($name)
  {
    $extention = preg_replace('/.*\.(.*[^\.].*)*/iU','\\1', $name); //取得文件扩展名;
    return $extention;
  } 
	
	
}